// 从redux导入dispatch的数据类型
import { Dispatch, AnyAction } from 'redux'
import { loginApi } from '@/utils/request/api'
import storage from '@/utils/storageManage'

import { SET_AUTH, SET_MENUS } from './actionNames'

export interface LoginReqArguInterface {
  account: string
  pwd: string
  imgcode: string
}

export interface authInfoInterface {
  status: boolean
  message: string
  userInfo: {}
  auth: any[]
}

const defaultValue: authInfoInterface = {
  status: false,
  message: '',
  userInfo: {},
  auth: [],
}

/**
 * 创建一个派发login的action方法
 * @param options 登陆系统所需要的信息
 * @returns
 */
export function loginAction(options: LoginReqArguInterface) {
  // 这里返回给组件一个回调函数，就可以激活redux-thunk，然后从thunk中获取到dispatch
  return (dispatch: Dispatch) => {
    // 手动请求接口并进行一些细节处理
    return loginApi(options)
      .then((res: any) => {
        const { token, unique_auth, user_info, expires_time, menus } = res
        // token并不参与页面渲染，而且在axios封装中使用redux也很不友好，所以，这里将token与有效期存入storage
        storage.set('token', token, expires_time)
        // 派发存储菜单的操作
        dispatch({
          type: SET_MENUS,
          payload: menus,
        })
        // 派发存储用户信息的操作
        dispatch({
          type: SET_AUTH,
          payload: {
            status: true,
            auth: unique_auth,
            userInfo: user_info,
          },
        })
        return Promise.resolve(res)
      })
      .catch(err => {
        console.log('登陆失败', err)
        return Promise.reject(err)
      })
  }
}

export function authInfo(state = defaultValue, { type, payload }: AnyAction) {
  // console.log('store接收到了更新内容，type为: %s; 传入状态为: ', type, payload)
  switch (type) {
    case SET_AUTH:
      return { ...state, ...payload }
    default:
      return state
  }
}
